#ifndef MODULE_GENERAL_REG_H
#define MODULE_GENERAL_REG_H

#include <stdint.h>
#include <module_header_reg.h>

//-------------- 1个字节 -------------------
//寄存器0x41：控制模块(更新设置 和 更新占空比)
typedef struct{
    union{
        struct{
            uint8_t usr     : 1;
            uint8_t usg     : 1;
            uint8_t usb     : 1;
            uint8_t usw     : 1;
            uint8_t usy     : 1;
            uint8_t        : 3;
        };
        uint8_t value;
        uint8_t data[1];
    };
}module_control_header_reg_t;
//-------------- 1个字节 -------------------
//寄存器0x42：控制模块(更新设置 和 更新占空比)
// typedef struct{
//     union{
//         struct{
//             uint8_t usr     : 1;
//             uint8_t usg     : 1;
//             uint8_t usb     : 1;
//             uint8_t usw     : 1;
//             uint8_t usy     : 1;
//             uint8_t        : 3;
//         };
//         uint8_t value;
//         uint8_t data[1];
//     };
// }module_control_reg_t;
typedef struct{
    union{
        struct{
            uint8_t ius0     : 1;
            uint8_t ius1     : 1;
            uint8_t ius2     : 1;
            uint8_t ius3     : 1;
            uint8_t          : 4;
        };
        uint8_t value;
        uint8_t data[1];
    };
}module_control_reg_t;
//-------------- 1个字节 -------------------
//寄存器0x44：状态编号 (S)tatus (N)umber
typedef struct{
    union{
        struct{
            uint8_t sn_l : 1;
            uint8_t sn_h : 1;
            uint8_t      : 6;
        };
        uint8_t value;
        uint8_t data[1];
    };
}module_status_number_reg_t;

//-------------- 1个字节 -------------------
//寄存器0x45：已启用的状态 (A)ctived (S)tatus 0x03[0x45
typedef struct{
    union{
        struct{
            uint8_t as0 : 1;
            uint8_t as1 : 1;
            uint8_t as2 : 1;
            uint8_t as3 : 1;
            uint8_t     : 4;
        };
        uint8_t value;
        uint8_t data[1];
    };
}module_actived_status_reg_t;

//-------------- 1个字节 -------------------
//寄存器0x47：引脚电平
typedef struct{
    union{
        struct{
            uint8_t red : 1;
            uint8_t green : 1;
            uint8_t blue : 1;
            uint8_t white : 1;
            uint8_t yellow : 1;
            uint8_t   : 3;
        };
        uint8_t value;
        uint8_t data[1];
    };
}module_pin_level_reg_t;

//-------------- 1个字节 -------------------
// 寄存器0x48：状态详细参数-模式及自定义模式下的频率编号
// /********  SMFN_H SMFN_M SMFN_L Freq Number *********/ 
//  0 0 0 125 Hz
//  0 0 1 500 Hz
//  0 1 0 4 KHz (default)
//  0 1 1 32 KHz
// /******** SM:Status (M)ode *********/ 
// 0 选择频率模式.(默认)
// 1 自定义频率模式.
typedef struct{
    union{
        struct{
            uint8_t smfn_l      : 1;
            uint8_t smfn_m      : 1;
            uint8_t smfn_h      : 1;
            uint8_t             : 4;
            uint8_t sm          : 1;
        };
        uint8_t value;
        uint8_t data[1];
    };
}module_freq_mode_select_status_reg_t;

//-------------- 1个字节 -------------------
// 寄存器0x49：引脚使能情况, UI控制使用
// 未使能的引脚, 负载都处于断开状态
// 0: 关闭
// 1: 使能
typedef struct{
    union{
        struct{
            uint8_t red      : 1;
            uint8_t green    : 1;
            uint8_t blue     : 1;
            uint8_t white    : 1;
            uint8_t yellow   : 1;
            uint8_t          : 3;
        }pin;
        uint8_t value;
        uint8_t data[1];
    };
}module_pin_used_reg_t;

//-------------- 1个字节 -------------------
// 寄存器0x4A：引脚使能情况, UI用-选择频率模式下的引脚状态
// 在选择频率模式下, 5个引脚都可以输出PWM波形或开关, 用此寄存器进行记录
// 0: 开关模式, (默认)输出高低电平. PWM 无法全部关断. 
// 1: PWM模式
// 未使能的引脚, 负载都处于断开状态
typedef struct{
    union{
        struct{
            uint8_t red      : 1;
            uint8_t green    : 1;
            uint8_t blue     : 1;
            uint8_t white    : 1;
            uint8_t yellow   : 1;
            uint8_t          : 3;
        }pin;
        uint8_t value;
        uint8_t data[1];
    };
}module_pin_output_mode_reg_t;


//-------------- 1个字节 -------------------
// 寄存器0x4B-0x4F：RGBWY 引脚占空比-默认50% SW 模式下 >0x7F ON
typedef struct{
    union{
        struct{
            uint8_t bit0    : 1;
            uint8_t bit1    : 1;
            uint8_t bit2    : 1;
            uint8_t bit3    : 1;
            uint8_t bit4    : 1;
            uint8_t bit5    : 1;
            uint8_t bit6    : 1;
            uint8_t bit7    : 1;
        }pin;
        uint8_t value;
        uint8_t data[1];
    };
}module_pwm_duty_cycle_reg_t;

//-------------- 4个字节 [1个字节未使用]-------------------
// 寄存器0x50-0x5B：R 引脚占空比-默认50% SW 模式下 >0x7F ON
typedef struct{
    union{
        struct{
            uint8_t low;
            uint8_t mid;
            uint8_t high;
            uint8_t top;
        };
        uint32_t value;
        uint8_t data[4];
    };
}module_pwm_custom_freq_reg_t;

//-------------- 21个字节 -------------------
//模块信息查询结构体定义
typedef struct 
{
    //仅在选择频率模式下有效
    module_freq_mode_select_status_reg_t       freq_mode_select_status_reg;//选择频率模式及自定义频率编号 8bits = 1 byte(0x48)
    // 0: 关闭 / 1: 使能
    module_pin_used_reg_t                                     pin_used_reg;//引脚使用情况, UI用 8bits = 1 byte(0x49)
    // 0: 开关模式 / 1: PWM模式
    module_pin_output_mode_reg_t                       pin_output_mode_reg;//PWM, SW 选择 8bits = 1 byte(0x4A)
    //SW 模式下的电平设置寄存器
    //module_pin_out_level_reg_t                           pin_out_level_reg;//8bits = 1 byte(0x08)

    struct
    {
        module_pwm_duty_cycle_reg_t                         red_pin;//自定义频率 R 引脚占空比 8bits = 1 byte(0x4B)
        module_pwm_duty_cycle_reg_t                       green_pin;//自定义频率 G 引脚占空比 8bits = 1 byte(0x4C)
        module_pwm_duty_cycle_reg_t                        blue_pin;//自定义频率 B 引脚占空比 8bits = 1 byte(0x4D)
        module_pwm_duty_cycle_reg_t                       white_pin;//自定义频率 W 引脚占空比 8bits = 1 byte(0x4E)
        module_pwm_duty_cycle_reg_t                      yellow_pin;//自定义频率 Y 引脚占空比 8bits = 1 byte(0x4F)
    }pwm_duty_cycle_reg;

    struct
    {   
        module_pwm_custom_freq_reg_t                           red_pin;//自定义频率 R 频率 (小端模式 0x50 第1个字节 + 0x51第2个字节 + 0x52第3个字节 +0x53第4个字节) 
        module_pwm_custom_freq_reg_t                         green_pin;//自定义频率 R 频率 (小端模式 0x54 第1个字节 + 0x55第2个字节 + 0x56第3个字节 +0x57第4个字节) 
        module_pwm_custom_freq_reg_t                          blue_pin;//自定义频率 R 频率 (小端模式 0x58 第1个字节 + 0x59第2个字节 + 0x5A第3个字节 +0x5B第4个字节) 
    }pwm_custom_freq_reg;

}module_general_info_t;


typedef struct
{
    union{
        struct
        {
            module_control_header_reg_t  module_control_header_reg;//1字节:0x00+OFFSET(0x41)

            module_control_reg_t                module_control_reg;//1字节:0x00+OFFSET(0x42)

            module_reserved_reg_t           module_reserved_43_reg;//1字节:0x01+OFFSET(0x43)             

            module_status_number_reg_t    module_status_number_reg;//1字节:0x02+OFFSET(0x44)

            module_actived_status_reg_t  module_actived_status_reg;//1字节:0x03+OFFSET(0x45)

            module_reserved_reg_t           module_reserved_46_reg;//1字节:0x04+OFFSET(0x46)

            module_pin_level_reg_t           module_pin_level_reg;//1字节:0x05+OFFSET(0x47)

            module_general_info_t           module_general_info[4];//20x4字节 (0x48-0x5B)
        };
        
        uint8_t data[87];
    };
    
}module_general_reg_t;//6+20x4 = 86


typedef struct
{
    module_header_reg_t       module_header_reg;//40字节
    module_general_reg_t module_general_reg;//161字节
}module_reg_t;
#endif